phys_table = (l2_pgentry_t *) map_domain_mem(pagetable_val(
ed->arch.phys_table));
memcpy(d->arch.mm_perdomain_pt, phys_table,
- ENTRIES_PER_L1_PAGETABLE * sizeof(l1_pgentry_t));
+ L1_PAGETABLE_ENTRIES * sizeof(l1_pgentry_t));
unmap_domain_mem(phys_table);
unmap_domain_mem(mpl2e);
pl1e = map_domain_mem(page_nr << PAGE_SHIFT);
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
if ( unlikely(!get_page_from_l1e(pl1e[i], d)) )
goto fail;
pl1e = map_domain_mem(page_nr << PAGE_SHIFT);
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
put_page_from_l1e(pl1e[i], d);
unmap_domain_mem(pl1e);
*/
pl1e = ptwr_info[cpu].ptinfo[which].pl1e;
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
{
ol1e = ptwr_info[cpu].ptinfo[which].page[i];
nl1e = pl1e[i];
* reference counts are correct.
*/
memcpy(&pl1e[i], &ptwr_info[cpu].ptinfo[which].page[i],
- (ENTRIES_PER_L1_PAGETABLE - i) * sizeof(l1_pgentry_t));
+ (L1_PAGETABLE_ENTRIES - i) * sizeof(l1_pgentry_t));
unmap_domain_mem(pl1e);
ptwr_info[cpu].ptinfo[which].l1va = 0;
UNLOCK_BIGLOCK(d);
ptwr_info[cpu].ptinfo[which].pl1e = map_domain_mem(pfn << PAGE_SHIFT);
memcpy(ptwr_info[cpu].ptinfo[which].page,
ptwr_info[cpu].ptinfo[which].pl1e,
- ENTRIES_PER_L1_PAGETABLE * sizeof(l1_pgentry_t));
+ L1_PAGETABLE_ENTRIES * sizeof(l1_pgentry_t));
/* Finally, make the p.t. page writable by the guest OS. */
pte |= _PAGE_RW;
case PGT_l1_page_table:
case PGT_l2_page_table:
pt = map_domain_mem(pfn<<PAGE_SHIFT);
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
if ( (pt[i] & _PAGE_PRESENT) &&
((pt[i] >> PAGE_SHIFT) == xpfn) )
printk(" found dom=%d i=%x pfn=%lx t=%x c=%x\n",
#endif
pt = map_domain_mem( pfn<<PAGE_SHIFT );
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
{
if ( pt[i] & _PAGE_PRESENT )
{
pt = map_domain_mem( pfn<<PAGE_SHIFT );
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
{
if ( pt[i] & _PAGE_PRESENT )
{
case PGT_l2_page_table:
p = map_domain_mem((spage - frame_table) << PAGE_SHIFT);
if ( shadow_mode(d) == SHM_full_32 )
- memset(p, 0, ENTRIES_PER_L2_PAGETABLE * sizeof(*p));
+ memset(p, 0, L2_PAGETABLE_ENTRIES * sizeof(*p));
else
memset(p, 0, DOMAIN_ENTRIES_PER_L2_PAGETABLE * sizeof(*p));
unmap_domain_mem(p);
__shadow_set_l2e(ed, va, sl2e);
gpl1e = (unsigned long *) &(linear_pg_table[
- (va>>L1_PAGETABLE_SHIFT) & ~(ENTRIES_PER_L1_PAGETABLE-1)]);
+ (va>>L1_PAGETABLE_SHIFT) & ~(L1_PAGETABLE_ENTRIES-1)]);
spl1e = (unsigned long *) &(shadow_linear_pg_table[
- (va>>L1_PAGETABLE_SHIFT) & ~(ENTRIES_PER_L1_PAGETABLE-1)]);
+ (va>>L1_PAGETABLE_SHIFT) & ~(L1_PAGETABLE_ENTRIES-1)]);
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
l1pte_propagate_from_guest(d, &gpl1e[i], &spl1e[i]);
}
else
gpl1e = map_domain_mem(g2mfn << PAGE_SHIFT);
spl1e = map_domain_mem(s2mfn << PAGE_SHIFT);
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
check_pte(d, &gpl1e[i], &spl1e[i], 1, i);
unmap_domain_mem(spl1e);
/* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */
int map_pages(
- pagetable_t *pt,
+ root_pgentry_t *pt,
unsigned long v,
unsigned long p,
unsigned long s,
{
l1 = (l1_pgentry_t *)heap_start;
heap_start = (void *)((unsigned long)heap_start + PAGE_SIZE);
- for ( j = 0; j < ENTRIES_PER_L1_PAGETABLE; j++ )
+ for ( j = 0; j < L1_PAGETABLE_ENTRIES; j++ )
l1[j] = mk_l1_pgentry((i << L2_PAGETABLE_SHIFT) |
(j << L1_PAGETABLE_SHIFT) |
__PAGE_HYPERVISOR);
/* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */
int map_pages(
- pagetable_t *pt,
+ root_pgentry_t *pt,
unsigned long v,
unsigned long p,
unsigned long s,
unsigned long i, p, max;
/* Map all of physical memory. */
- max = ((max_page + ENTRIES_PER_L1_PAGETABLE - 1) &
- ~(ENTRIES_PER_L1_PAGETABLE - 1)) << PAGE_SHIFT;
+ max = ((max_page + L1_PAGETABLE_ENTRIES - 1) &
+ ~(L1_PAGETABLE_ENTRIES - 1)) << PAGE_SHIFT;
map_pages(idle_pg_table, PAGE_OFFSET, 0, max, PAGE_HYPERVISOR);
/*
continue;
m2p_start_mfn = l2_pgentry_to_pfn(l2e);
- for ( i = 0; i < ENTRIES_PER_L1_PAGETABLE; i++ )
+ for ( i = 0; i < L1_PAGETABLE_ENTRIES; i++ )
{
frame_table[m2p_start_mfn+i].count_info = PGC_allocated | 1;
/* gdt to make sure it's only mapped read-only by non-privileged
for ( i = 0; i < (xenheap_phys_end >> L2_PAGETABLE_SHIFT); i++ )
{
ALLOC_PT(l1);
- for ( j = 0; j < ENTRIES_PER_L1_PAGETABLE; j++ )
+ for ( j = 0; j < L1_PAGETABLE_ENTRIES; j++ )
l1[j] = mk_l1_pgentry((i << L2_PAGETABLE_SHIFT) |
(j << L1_PAGETABLE_SHIFT) |
__PAGE_HYPERVISOR);
#include <asm/x86_64/page.h>
#endif
+/* Page-table type. */
+#ifndef __ASSEMBLY__
+typedef struct { unsigned long pt_lo; } pagetable_t;
+#define pagetable_val(_x) ((_x).pt_lo)
+#define mk_pagetable(_x) ( (pagetable_t) { (_x) } )
+#endif
+
#ifndef __ASSEMBLY__
#define PAGE_SIZE (1UL << PAGE_SHIFT)
#else
#define DOMAIN_ENTRIES_PER_L2_PAGETABLE \
(HYPERVISOR_VIRT_START >> L2_PAGETABLE_SHIFT)
#define HYPERVISOR_ENTRIES_PER_L2_PAGETABLE \
- (ENTRIES_PER_L2_PAGETABLE - DOMAIN_ENTRIES_PER_L2_PAGETABLE)
+ (L2_PAGETABLE_ENTRIES - DOMAIN_ENTRIES_PER_L2_PAGETABLE)
#ifndef __ASSEMBLY__
#include <asm/processor.h>
#define va_to_l1mfn(_va) (l2_pgentry_val(linear_l2_table[_va>>L2_PAGETABLE_SHIFT]) >> PAGE_SHIFT)
-extern pagetable_t idle_pg_table[ENTRIES_PER_PAGETABLE];
+extern root_pgentry_t idle_pg_table[ROOT_PAGETABLE_ENTRIES];
extern void paging_init(void);
/* Map physical byte range (@p, @p+@s) at virt address @v in pagetable @pt. */
extern int
map_pages(
- pagetable_t *pt,
+ root_pgentry_t *pt,
unsigned long v,
unsigned long p,
unsigned long s,
spl2e = (l2_pgentry_t *)map_domain_mem(smfn << PAGE_SHIFT);
gpl2e = (l2_pgentry_t *)map_domain_mem(gpfn << PAGE_SHIFT);
- memset(spl2e, 0, ENTRIES_PER_L2_PAGETABLE * sizeof(l2_pgentry_t));
+ memset(spl2e, 0, L2_PAGETABLE_ENTRIES * sizeof(l2_pgentry_t));
ed->arch.shadow_vtable = spl2e;
ed->arch.vpagetable = gpl2e; /* expect the guest did clean this up */
#ifndef __X86_32_PAGE_H__
#define __X86_32_PAGE_H__
-#define L1_PAGETABLE_SHIFT 12
-#define L2_PAGETABLE_SHIFT 22
-#define PAGE_SHIFT L1_PAGETABLE_SHIFT
+#define L1_PAGETABLE_SHIFT 12
+#define L2_PAGETABLE_SHIFT 22
+#define PAGE_SHIFT L1_PAGETABLE_SHIFT
+#define ROOT_PAGETABLE_SHIFT L2_PAGETABLE_SHIFT
-#define ENTRIES_PER_L1_PAGETABLE 1024
-#define ENTRIES_PER_L2_PAGETABLE 1024
+#define L1_PAGETABLE_ENTRIES 1024
+#define L2_PAGETABLE_ENTRIES 1024
+#define ROOT_PAGETABLE_ENTRIES L2_PAGETABLE_ENTRIES
-#define __PAGE_OFFSET (0xFC400000)
+#define __PAGE_OFFSET (0xFC400000)
+
+#define PADDR_BITS 32
+#define VADDR_BITS 32
+#define PADDR_MASK (~0UL)
+#define VADDR_MASK (~0UL)
#ifndef __ASSEMBLY__
#include <xen/config.h>
typedef struct { unsigned long l1_lo; } l1_pgentry_t;
typedef struct { unsigned long l2_lo; } l2_pgentry_t;
+typedef l2_pgentry_t root_pgentry_t;
#endif /* !__ASSEMBLY__ */
/* Strip type from a table entry. */
/* Given a virtual address, get an entry offset into a page table. */
#define l1_table_offset(_a) \
- (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
+ (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1))
#define l2_table_offset(_a) \
((_a) >> L2_PAGETABLE_SHIFT)
/* Given a virtual address, get an entry offset into a linear page table. */
#define l1_linear_offset(_a) ((_a) >> PAGE_SHIFT)
-/* Root page-table definitions. */
-#define pagetable_t l2_pgentry_t
-#define pagetable_val(_x) ((_x).l2_lo)
-#define mk_pagetable(_x) ( (l2_pgentry_t) { (_x) } )
-#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L2_PAGETABLE
-
#endif /* __X86_32_PAGE_H__ */
#ifndef __X86_64_PAGE_H__
#define __X86_64_PAGE_H__
-#define L1_PAGETABLE_SHIFT 12
-#define L2_PAGETABLE_SHIFT 21
-#define L3_PAGETABLE_SHIFT 30
-#define L4_PAGETABLE_SHIFT 39
-#define PAGE_SHIFT L1_PAGETABLE_SHIFT
+#define L1_PAGETABLE_SHIFT 12
+#define L2_PAGETABLE_SHIFT 21
+#define L3_PAGETABLE_SHIFT 30
+#define L4_PAGETABLE_SHIFT 39
+#define PAGE_SHIFT L1_PAGETABLE_SHIFT
+#define ROOT_PAGETABLE_SHIFT L4_PAGETABLE_SHIFT
-#define ENTRIES_PER_L1_PAGETABLE 512
-#define ENTRIES_PER_L2_PAGETABLE 512
-#define ENTRIES_PER_L3_PAGETABLE 512
-#define ENTRIES_PER_L4_PAGETABLE 512
+#define L1_PAGETABLE_ENTRIES 512
+#define L2_PAGETABLE_ENTRIES 512
+#define L3_PAGETABLE_ENTRIES 512
+#define L4_PAGETABLE_ENTRIES 512
+#define ROOT_PAGETABLE_ENTRIES L4_PAGETABLE_ENTRIES
-#define __PAGE_OFFSET (0xFFFF830000000000)
+#define __PAGE_OFFSET (0xFFFF830000000000)
/* These may increase in future (phys. bits in particular). */
#define PADDR_BITS 40
typedef struct { unsigned long l2_lo; } l2_pgentry_t;
typedef struct { unsigned long l3_lo; } l3_pgentry_t;
typedef struct { unsigned long l4_lo; } l4_pgentry_t;
+typedef l4_pgentry_t root_pgentry_t;
#endif /* !__ASSEMBLY__ */
/* Strip type from a table entry. */
/* Given a virtual address, get an entry offset into a page table. */
#define l1_table_offset(_a) \
- (((_a) >> L1_PAGETABLE_SHIFT) & (ENTRIES_PER_L1_PAGETABLE - 1))
+ (((_a) >> L1_PAGETABLE_SHIFT) & (L1_PAGETABLE_ENTRIES - 1))
#define l2_table_offset(_a) \
- (((_a) >> L2_PAGETABLE_SHIFT) & (ENTRIES_PER_L2_PAGETABLE - 1))
+ (((_a) >> L2_PAGETABLE_SHIFT) & (L2_PAGETABLE_ENTRIES - 1))
#define l3_table_offset(_a) \
- (((_a) >> L3_PAGETABLE_SHIFT) & (ENTRIES_PER_L3_PAGETABLE - 1))
+ (((_a) >> L3_PAGETABLE_SHIFT) & (L3_PAGETABLE_ENTRIES - 1))
#define l4_table_offset(_a) \
- (((_a) >> L4_PAGETABLE_SHIFT) & (ENTRIES_PER_L4_PAGETABLE - 1))
+ (((_a) >> L4_PAGETABLE_SHIFT) & (L4_PAGETABLE_ENTRIES - 1))
/* Given a virtual address, get an entry offset into a linear page table. */
#define l1_linear_offset(_a) (((_a) & VADDR_MASK) >> PAGE_SHIFT)
-/* Root page-table definitions. */
-#define pagetable_t l4_pgentry_t
-#define pagetable_val(_x) ((_x).l4_lo)
-#define mk_pagetable(_x) ( (l4_pgentry_t) { (_x) } )
-#define ENTRIES_PER_PAGETABLE ENTRIES_PER_L4_PAGETABLE
-
#endif /* __X86_64_PAGE_H__ */